package com.shiguiwu.springmybatis.leetcode;

import com.shiguiwu.springmybatis.spring.lazy.A;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;

/**
 * @description: 数组操作
 * @author: stone
 * @date: Created by 2022/8/26 12:43
 * @version: 1.0.0
 * @pakeage: com.shiguiwu.springmybatis.leetcode
 */
@Slf4j
public class ArrayTests {

    public static void main(String[] args) {
        ArrayTests array = new ArrayTests();

        int i = array.maxProduct(new int[]{2, 3, 5, 1});
        log.info("结果是 ===> {}", i);

    }


    /**
     * 给你一个整数数组 nums，请你选择数组的两个不同下标 i 和 j，使 (nums[i]-1)*(nums[j]-1) 取得最大值。
     *
     * 请你计算并返回该式的最大值。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/maximum-product-of-two-elements-in-an-array
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param nums
     * @return
     */
    public int maxProduct(int[] nums) {

        if (nums == null ||  nums.length == 0) {
            return -1;
        }

        Arrays.sort(nums);

        return (nums[nums.length-1] - 1) * (nums[nums.length-2] - 1);
    }


    /**
     *  给你一个数组 nums ，数组中有 2n 个元素，按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。
     *
     * 请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列，返回重排后的数组。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/shuffle-the-array
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * @param nums
     * @param n
     * @return
     */
    public int[] shuffle(int[] nums, int n) {
        int[] result = new int[2 * n];
        for (int i = 0; i < n; i++) {
            result[2 * i] = nums[i];
            result[2 * i + 1] = nums[i+n];
        }

        return result;
    }


    /**
     * 给你一个大小为 rows x cols 的矩阵 mat，其中 mat[i][j] 是 0 或 1，请返回 矩阵 mat 中特殊位置的数目 。
     *
     * 特殊位置 定义：如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0（行和列的下标均 从 0 开始 ），则位置 (i, j) 被称为特殊位置。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/special-positions-in-a-binary-matrix
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * [[1,0,0],[0,0,1],[1,0,0]]
     * 思路，基本就是暴力破解
     * @param mat
     * @return
     */
    public int numSpecial(int[][] mat) {
        int result = 0;

        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                if (mat[i][j] == 1 && this.check(mat,i,j)) {
                    result++;
                }
            }
        }

        return result;

    }

    public boolean check(int[][] mat, int ix, int jx){
        // 检查jx列 有没有 别的1
        for(int i = 0; i < mat.length; i++){
            if(mat[i][jx] == 1 && i != ix) {
                return false;
            }
        }
        // 检查ix行有没有别的1
        for(int j = 0; j < mat[0].length; j++) {
            if(mat[ix][j] == 1 && j != jx) {
                return false;
            }
        }
        return true;
    }



}
